﻿using Volo.Abp.Domain.Entities.Auditing;

namespace FlyingEye.Monitors.Models
{
    /// <summary>
    /// 监视任务模型
    /// </summary>
    public class ReadNumericValueTaskModel : AuditedEntity<Guid>
    {
#pragma warning disable CS8618 // 在退出构造函数时，不可为 null 的字段必须包含非 null 值。请考虑声明为可以为 null。
        private ReadNumericValueTaskModel() { }
#pragma warning restore CS8618 // 在退出构造函数时，不可为 null 的字段必须包含非 null 值。请考虑声明为可以为 null。

        public ReadNumericValueTaskModel(
            Guid deviceClientId,
            string taskName,
            string deviceName,
            string address,
            string dataType,
            int interval,
            bool enable)
        {
            DeviceClientId = deviceClientId;
            DeviceName = deviceName;
            TaskName = taskName;
            Address = address;
            DataType = dataType;
            Interval = interval;
            Enable = enable;
            // 一个相同的点位，可能会有多个不同的定时任务，所以要加入 Interval
            // 一个相同的地址 DeviceName, Address, DataType, Interval 不能配置重复轮训
            UniqueHashKey = CompositeKeyGenerator.GenerateKey(DeviceClientId, DeviceName, Address, DataType, Interval);
        }

        public Guid DeviceClientId { get; set; }

        /// <summary>
        /// 任务名称
        /// </summary>
        public string TaskName { get; set; }

        /// <summary>
        /// 设备名称
        /// 一个设备资源号下可能有多个设备
        /// </summary>
        public string DeviceName { get; set; }

        /// <summary>
        /// PLC 点位的地址
        /// </summary>
        public string Address { get; set; }

        /// <summary>
        /// PLC 读取的数据类型
        /// </summary>
        public string DataType { get; set; }

        /// <summary>
        /// 任务周期
        /// </summary>
        public int Interval { get; set; }

        /// <summary>
        /// 是否启用轮询任务
        /// </summary>
        public bool Enable { get; set; }

        private string? _uniqueHashKey;

        /// <summary>
        /// 标志组合唯一
        /// </summary>
        public string UniqueHashKey
        {
            get
            {
                if (_uniqueHashKey != CompositeKeyGenerator.GenerateKey(DeviceClientId, DeviceName, Address, DataType, Interval))
                {
                    _uniqueHashKey = CompositeKeyGenerator.GenerateKey(DeviceClientId, DeviceName, Address, DataType, Interval);
                }

                return _uniqueHashKey;
            }

            private set { _uniqueHashKey = value; }
        }
    }
}
